const express = require('express');
const router = express.Router();
const ossController = require('../controllers/ossController');
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const { v4: uuidv4 } = require('uuid');

// 配置multer用于文件上传
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    const uploadDir = 'uploads/';
    if (!fs.existsSync(uploadDir)) {
      fs.mkdirSync(uploadDir, { recursive: true });
    }
    cb(null, uploadDir);
  },
  filename: function (req, file, cb) {
    // 生成唯一文件名
    const uniqueName = uuidv4() + path.extname(file.originalname);
    cb(null, uniqueName);
  }
});

const upload = multer({
  storage: storage,
  limits: {
    fileSize: 500 * 1024 * 1024, // 限制500MB，适应视频文件
  },
  fileFilter: (req, file, cb) => {
    // 定义允许的文件类型
    const allowedExtensions = {
      // 图片类型
      images: /jpeg|jpg|png|gif|bmp|webp|svg|tiff|ico/,
      // 视频类型
      videos: /mp4|avi|mov|wmv|flv|webm|mkv|m4v|3gp|ogv/,
      // 音频类型
      audios: /mp3|wav|flac|aac|ogg|m4a|wma|opus/,
      // 文档类型
      documents: /pdf|doc|docx|txt|rtf|xls|xlsx|ppt|pptx/,
      // 压缩文件
      archives: /zip|rar|7z|tar|gz/,
      // 其他常用格式
      others: /json|xml|csv|html|css|js|ts/
    };
    
    // 合并所有允许的类型
    const allAllowedTypes = new RegExp(
      Object.values(allowedExtensions).map(regex => regex.source).join('|')
    );
    
    const extname = allAllowedTypes.test(path.extname(file.originalname).toLowerCase());
    
    // MIME类型检查
    const allowedMimeTypes = [
      // 图片 MIME 类型
      'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/bmp', 'image/webp', 'image/svg+xml', 'image/tiff', 'image/x-icon',
      // 视频 MIME 类型
      'video/mp4', 'video/avi', 'video/quicktime', 'video/x-msvideo', 'video/x-flv', 'video/webm', 'video/x-matroska', 'video/3gpp', 'video/ogg',
      // 音频 MIME 类型
      'audio/mpeg', 'audio/wav', 'audio/flac', 'audio/aac', 'audio/ogg', 'audio/mp4', 'audio/x-ms-wma', 'audio/opus',
      // 文档 MIME 类型
      'application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 
      'text/plain', 'application/rtf', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
      'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
      // 压缩文件 MIME 类型
      'application/zip', 'application/x-rar-compressed', 'application/x-7z-compressed', 'application/x-tar', 'application/gzip',
      // 其他 MIME 类型
      'application/json', 'application/xml', 'text/xml', 'text/csv', 'text/html', 'text/css', 'application/javascript', 'application/typescript'
    ];
    
    const mimetype = allowedMimeTypes.includes(file.mimetype);
    
    if (mimetype && extname) {
      return cb(null, true);
    } else {
      cb(new Error(`不支持的文件类型: ${file.originalname}。支持的文件类型包括图片、视频、音频、文档等常用格式。`), false);
    }
  }
});

// 错误处理中间件
const handleMulterError = (error, req, res, next) => {
  if (error instanceof multer.MulterError) {
    if (error.code === 'LIMIT_FILE_SIZE') {
      return res.status(400).json({
        success: false,
        error: '文件大小超过限制（最大500MB）',
        code: 'FILE_TOO_LARGE'
      });
    }
    if (error.code === 'LIMIT_FILE_COUNT') {
      return res.status(400).json({
        success: false,
        error: '上传文件数量超过限制',
        code: 'TOO_MANY_FILES'
      });
    }
  }
  if (error.message.includes('不支持的文件类型')) {
    return res.status(400).json({
      success: false,
      error: error.message,
      code: 'INVALID_FILE_TYPE'
    });
  }
  next(error);
};

// 路由定义
// ============================================
// 重要说明：所有OSS操作都基于 "resource_AiPersion/" 目录
// 所有的路径参数都是相对于 "resource_AiPersion/" 的相对路径

/**
 * 获取所有文件夹列表（在resource_AiPersion目录下）
 * GET /api/oss/folders
 */
router.get('/folders', ossController.getFolders.bind(ossController));

/**
 * 创建新文件夹（在resource_AiPersion目录下）
 * POST /api/oss/folders
 * Body: { folderName: "文件夹名称" } // 相对于resource_AiPersion的路径
 */
router.post('/CreatFolders', ossController.createFolder.bind(ossController));

/**
 * 获取指定文件夹的内容（在resource_AiPersion目录下）
 * GET /api/oss/folders/:folderName
 * :folderName - 相对于resource_AiPersion的文件夹路径
 */
router.post('/GetFoldersContents', ossController.getFolderContents.bind(ossController));

/**
 * 上传单个文件到指定文件夹（在resource_AiPersion目录下）
 * POST /api/oss/upload/:folderName
 * :folderName - 相对于resource_AiPersion的文件夹路径
 * Form-data: file (支持图片、视频、音频、文档等多种格式)
 * 支持的文件类型：
 * - 图片: jpg, png, gif, bmp, webp, svg, tiff, ico
 * - 视频: mp4, avi, mov, wmv, flv, webm, mkv, m4v, 3gp, ogv
 * - 音频: mp3, wav, flac, aac, ogg, m4a, wma, opus
 * - 文档: pdf, doc, docx, txt, rtf, xls, xlsx, ppt, pptx
 * - 压缩文件: zip, rar, 7z, tar, gz
 * - 其他: json, xml, csv, html, css, js, ts
 */
router.post('/upload/:folderName', upload.single('file'), handleMulterError, ossController.uploadSingleFile.bind(ossController));

/**
 * 批量上传文件到指定文件夹（在resource_AiPersion目录下）
 * POST /api/oss/upload-multiple/:folderName
 * :folderName - 相对于resource_AiPersion的文件夹路径
 * Form-data: files[] (支持多种文件格式)
 * 最大文件数量: 20个
 * 单个文件最大: 500MB
 */
router.post('/upload-multiple/:folderName', upload.array('files', 20), handleMulterError, ossController.uploadMultipleFiles.bind(ossController));

/**
 * 上传base64编码的音频数据到Voice文件夹（在resource_AiPersion/Ai_persion/Voice目录下）
 * POST /api/oss/upload-base64-audio
 * Body: { 
 *   base64Data: "base64编码的音频数据",
 *   fileName: "自定义文件名.mp3" (可选，支持.mp3, .wav, .m4a, .aac, .ogg格式)
 * }
 * 说明：
 * - 会自动上传到 "resource_AiPersion/Ai_persion/Voice/" 目录
 * - 如果不提供fileName，会自动生成基于时间戳的文件名
 * - 上传成功后会在控制台打印访问URL和音频时长
 * - 返回数据中包含音频时长（duration字段，单位：秒）
 */
router.post('/upload-base64-audio', ossController.uploadBase64Audio.bind(ossController));

/**
 * 通过URL下载图片并上传到Images文件夹（在resource_AiPersion/Ai_persion/Images目录下）
 * 支持webp转换和智能压缩
 * POST /api/oss/upload-image-from-url
 * Body: { 
 *   imageUrl: "图片的URL地址",
 *   fileName: "自定义文件名.jpg" (可选，支持各种图片格式),
 *   task_id: "550e8400-e29b-41d4-a716-446655440000" (可选，图像生成任务UUID，用于更新数据库记录),
 *   convertToWebp: true (可选，是否转换为webp格式，默认true),
 *   quality: 80 (可选，压缩质量1-100，默认80),
 *   width: 1024 (可选，调整宽度，保持比例),
 *   height: 768 (可选，调整高度，保持比例)
 * }
 * 说明：
 * - 会自动下载指定URL的图片并进行智能处理后上传到 "resource_AiPersion/Ai_persion/Images/" 目录
 * - 支持webp转换，大幅减小文件体积
 * - 可精细调整压缩质量（1-100）
 * - 可调整图片尺寸，自动保持宽高比
 * - 如果不提供fileName，会自动生成基于时间戳的文件名
 * - 支持最大20MB的原始图片文件，处理后限制10MB
 * - 自动检测并优化图片格式
 * - 如果提供task_id，会自动更新image_generation_tasks表中对应记录的image_url字段
 * - 上传成功后会在控制台打印详细的处理信息，包括压缩率等
 */
router.post('/upload-image-from-url', ossController.uploadImageFromUrl.bind(ossController));

/**
 * 删除文件（在resource_AiPersion目录下）
 * DELETE /api/oss/files
 * Body: { ossPath: "文件的相对路径" } // 相对于resource_AiPersion的路径
 */
router.delete('/files', ossController.deleteFile.bind(ossController));

/**
 * 删除文件夹及其所有内容（在resource_AiPersion目录下）
 * DELETE /api/oss/folders/:folderName
 * :folderName - 相对于resource_AiPersion的文件夹路径
 */
router.delete('/folders/:folderName', ossController.deleteFolder.bind(ossController));

/**
 * 检查文件是否存在（在resource_AiPersion目录下）
 * GET /api/oss/files/exists
 * Query: ossPath=文件的相对路径 // 相对于resource_AiPersion的路径
 */
router.get('/files/exists', ossController.checkFileExists.bind(ossController));

/**
 * 获取文件信息（在resource_AiPersion目录下）
 * GET /api/oss/files/info
 * Query: ossPath=文件的相对路径 // 相对于resource_AiPersion的路径
 */
router.get('/files/info', ossController.getFileInfo.bind(ossController));

/**
 * 生成预签名URL（用于临时访问私有文件，在resource_AiPersion目录下）
 * GET /api/oss/presigned-url
 * Query: ossPath=文件的相对路径&expires=过期时间(秒) // ossPath相对于resource_AiPersion的路径
 */
router.get('/presigned-url', ossController.generatePresignedUrl.bind(ossController));

/**
 * 获取OSS统计信息
 * GET /api/oss/stats
 */
router.get('/stats', ossController.getStats.bind(ossController));

/**
 * 健康检查
 * GET /api/oss/health
 */
router.get('/health', ossController.healthCheck.bind(ossController));

module.exports = router; 